//自己
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        //转化为: 找到最长子数组的长度, 数组中数的种类不超过2
        unordered_map<int, int> unmap;//哈希表
        int len = 0, n = fruits.size();
        for (int left=0, right=0; right < n; right++)
        {
            unmap[fruits[right]]++;//1.进窗口
            while (unmap.size() > 2)//2.判断
            {
                unmap[fruits[left]]--;//4.出窗口
                if (unmap[fruits[left]] == 0)//left位置的这种水果个数==0时, 删除
                    unmap.erase(fruits[left]);
                left++;//别忘了
            }
            //3.更新len
            len = max(len, right-left+1);
        }
        return len;
    }
};


//老师
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        //滑动窗口
        //转化为: 找到最长子数组的长度, 数组中数的种类不超过2
        unordered_map<int, int> hash;//哈希表; 统计窗口有多少种水果
        int len = 0, n = fruits.size();
        for (int left=0, right=0; right < n; right++)
        {
            hash[fruits[right]]++;//1.进窗口
            while (hash.size() > 2)//2.判断
            {
                hash[fruits[left]]--;//4.出窗口
                if (hash[fruits[left]] == 0)//left位置的这种水果个数==0时, 删除
                    hash.erase(fruits[left]);
                left++;//别忘了
            }
            //3.更新len
            len = max(len, right-left+1);
        }
        return len;
    }
};
//时间 O(N)
//空间 O(1)
//频繁调用哈希表[] 和 size() 函数, 有些消耗
//题目中水果有限, 可以用数组模拟哈希表的方式, 降低消耗



//老师, 用数组模拟哈希表
class Solution {
public:
    int totalFruit(vector<int>& f) {
        //滑动窗口
        //转化为: 找到最长子数组的长度, 数组中数的种类不超过2
        int hash[100001] = { 0 };//模拟哈希表; 统计窗口有多少种水果
        int len = 0, n = f.size(), kinds = 0;
        for (int left=0, right=0; right < n; right++)
        {
            if (hash[f[right]] == 0) kinds++;//说明即将增加一种水果; 维护水果种类
            hash[f[right]]++;//1.进窗口
            while (kinds > 2)//2.判断
            {
                hash[f[left]]--;//4.出窗口
                if (hash[f[left]] == 0)//left位置的这种水果个数==0时, 删除
                    kinds--;//种类--
                left++;//别忘了
            }
            //3.更新len
            len = max(len, right-left+1);
        }
        return len;
    }
};
//时间 O(N)
//空间 O(1)
//频繁调用哈希表[] 和 size() 函数, 有些消耗
//题目中水果有限, 可以用数组模拟哈希表的方式, 降低消耗